home *** CD-ROM | disk | FTP | other *** search
/ Isometric Game Programming with DirectX 7.0 / Isometric Game Programming.iso / source / chapter13 / isohex13_4 / ddfuncs.cpp next >
C/C++ Source or Header  |  2000-05-24  |  9KB  |  389 lines

  1. /*****************************************************************************
  2. DDFuncs.cpp
  3. Ernest S. Pazera
  4. 21MAY2000
  5. Requires the use of ddraw.lib and dxguid.lib
  6. Also requires GDICanvas.h/cpp
  7. *****************************************************************************/
  8.  
  9. #include "DDFuncs.h"
  10.  
  11. ///////////////////////////////////////////////////////////////////////////////
  12. //DDSURFACEDESC2 functions
  13. ///////////////////////////////////////////////////////////////////////////////
  14.  
  15. //clean out a DDSD
  16. void DDSD_Clear(DDSURFACEDESC2* pddsd)
  17. {
  18.     //clear the ddsd to all zeros
  19.     memset(pddsd,0,sizeof(DDSURFACEDESC2));
  20.  
  21.     //set the size
  22.     pddsd->dwSize=sizeof(DDSURFACEDESC2);
  23. }
  24.  
  25. //set up a DDSD for a primary surface, no back buffer
  26. void DDSD_PrimarySurface(DDSURFACEDESC2* pddsd)
  27. {
  28.     //clean out the ddsd
  29.     DDSD_Clear(pddsd);
  30.  
  31.     //set flags
  32.     pddsd->dwFlags=DDSD_CAPS;
  33.  
  34.     //set caps
  35.     pddsd->ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE;
  36.  
  37. }
  38.  
  39. //set up a DDSD for a primary surface, with any number of backbuffers
  40. void DDSD_PrimarySurfaceWBackBuffer(DDSURFACEDESC2* pddsd, DWORD dwBackBufferCount)
  41. {
  42.     //clean out the ddsd
  43.     DDSD_Clear(pddsd);
  44.  
  45.     //set flags
  46.     pddsd->dwFlags=DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
  47.  
  48.     //set caps
  49.     pddsd->ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
  50.  
  51.     //set back buffer count
  52.     pddsd->dwBackBufferCount=dwBackBufferCount;
  53. }
  54.  
  55. //set up a DDSD for an offscreen surface, specify width and height
  56. void DDSD_OffscreenSurface(DDSURFACEDESC2* pddsd,DWORD dwWidth, DWORD dwHeight)
  57. {
  58.     //clean out the ddsd
  59.     DDSD_Clear(pddsd);
  60.  
  61.     //set flags
  62.     pddsd->dwFlags=DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
  63.  
  64.     //set caps
  65.     pddsd->ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
  66.  
  67.     //set width and height
  68.     pddsd->dwWidth=dwWidth;
  69.     pddsd->dwHeight=dwHeight;
  70.  
  71. }
  72.  
  73. ///////////////////////////////////////////////////////////////////////////////
  74. //DDSCAPSC2 functions
  75. ///////////////////////////////////////////////////////////////////////////////
  76.  
  77. //clean out ddscaps
  78. void DDSCAPS_Clear(DDSCAPS2* pddscaps)
  79. {
  80.     //clear to all zeros
  81.     memset(pddscaps,0,sizeof(DDSCAPS2));
  82. }
  83.  
  84. //set up ddscaps for back buffer
  85. void DDSCAPS_BackBuffer(DDSCAPS2* pddscaps)
  86. {
  87.     //clean out structure
  88.     DDSCAPS_Clear(pddscaps);
  89.  
  90.     //specify back buffer caps
  91.     pddscaps->dwCaps=DDSCAPS_BACKBUFFER;
  92. }
  93.  
  94. ///////////////////////////////////////////////////////////////////////////////
  95. //DDBLTFX functions
  96. ///////////////////////////////////////////////////////////////////////////////
  97.  
  98. //clean out a ddbltfx structure
  99. void DDBLTFX_Clear(DDBLTFX* pddbltfx)
  100. {
  101.     //set to all zeros
  102.     memset(pddbltfx,0,sizeof(DDBLTFX));
  103.  
  104.     //set dwsize
  105.     pddbltfx->dwSize=sizeof(DDBLTFX);
  106. }
  107.  
  108. //set up a ddbltfx for a color fill
  109. void DDBLTFX_ColorFill(DDBLTFX* pddbltfx,DWORD dwColor)
  110. {
  111.     //clean out structure
  112.     DDBLTFX_Clear(pddbltfx);
  113.  
  114.     //set fill color member
  115.     pddbltfx->dwFillColor=dwColor;
  116. }
  117.  
  118. ///////////////////////////////////////////////////////////////////////////////
  119. //DDPIXELFORMAT functions
  120. ///////////////////////////////////////////////////////////////////////////////
  121.  
  122. //clean a ddpixelformat structure
  123. void DDPF_Clear(DDPIXELFORMAT* pddpf)
  124. {
  125.     //set to all zeros
  126.     memset(pddpf,0,sizeof(DDPIXELFORMAT));
  127.  
  128.     //set size
  129.     pddpf->dwSize=sizeof(DDPIXELFORMAT);
  130. }
  131.  
  132. ///////////////////////////////////////////////////////////////////////////////
  133. //Direct Draw Initialization/Cleanup functions
  134. ///////////////////////////////////////////////////////////////////////////////
  135.  
  136. //create direct draw interface
  137. LPDIRECTDRAW7 LPDD_Create(HWND hWnd,DWORD dwCoopLevel)
  138. {
  139.     //declare object pointer
  140.     LPDIRECTDRAW7 lpdd;
  141.  
  142.     //create object
  143.     DirectDrawCreateEx(NULL,(void**)&lpdd,IID_IDirectDraw7,NULL);
  144.  
  145.     //set cooperative level
  146.     lpdd->SetCooperativeLevel(hWnd,dwCoopLevel);
  147.  
  148.     //return pointer to object
  149.     return(lpdd);
  150. }
  151.  
  152. //safe release of direct draw
  153. void LPDD_Release(LPDIRECTDRAW7* lplpdd)
  154. {
  155.     //safe release
  156.     if(*lplpdd)
  157.     {
  158.         (*lplpdd)->Release();
  159.         (*lplpdd)=NULL;
  160.     }
  161. }
  162.  
  163. ///////////////////////////////////////////////////////////////////////////////
  164. //Surface Creation/Cleanup functions
  165. ///////////////////////////////////////////////////////////////////////////////
  166.  
  167. //primary surface
  168. LPDIRECTDRAWSURFACE7 LPDDS_CreatePrimary(LPDIRECTDRAW7 lpdd,DWORD dwBackBufferCount)
  169. {
  170.     //declare surface declaration
  171.     DDSURFACEDESC2 ddsd;
  172.  
  173.     if(dwBackBufferCount)
  174.     {
  175.         //has back buffer
  176.         DDSD_PrimarySurfaceWBackBuffer(&ddsd,dwBackBufferCount);
  177.     }
  178.     else
  179.     {
  180.         //has no back buffer
  181.         DDSD_PrimarySurface(&ddsd);
  182.     }
  183.  
  184.     //declare pointer
  185.     LPDIRECTDRAWSURFACE7 lpdds;
  186.     
  187.     //create the surface
  188.     lpdd->CreateSurface(&ddsd,&lpdds,NULL);
  189.  
  190.     //return the surface
  191.     return(lpdds);
  192. }
  193.  
  194. //back buffer
  195. LPDIRECTDRAWSURFACE7 LPDDS_GetSecondary(LPDIRECTDRAWSURFACE7 lpdds)
  196. {
  197.     //surface object pointer
  198.     LPDIRECTDRAWSURFACE7 lpddsback;
  199.  
  200.     //caps structure
  201.     DDSCAPS2 ddscaps;
  202.  
  203.     //fill in caps
  204.     DDSCAPS_BackBuffer(&ddscaps);
  205.  
  206.     //retrieve attached surface
  207.     lpdds->GetAttachedSurface(&ddscaps,&lpddsback);
  208.  
  209.     //return surface
  210.     return(lpddsback);
  211. }
  212.  
  213. //offscreen
  214. LPDIRECTDRAWSURFACE7 LPDDS_CreateOffscreen(LPDIRECTDRAW7 lpdd,DWORD dwWidth,DWORD dwHeight)
  215. {
  216.     //set up ddsd
  217.     DDSURFACEDESC2 ddsd;
  218.     DDSD_OffscreenSurface(&ddsd,dwWidth,dwHeight);
  219.  
  220.     //create surface
  221.     LPDIRECTDRAWSURFACE7 lpdds;
  222.     lpdd->CreateSurface(&ddsd,&lpdds,NULL);
  223.  
  224.     //return surface
  225.     return(lpdds);
  226. }
  227.  
  228. //offscreen with a bitmap from a file
  229. LPDIRECTDRAWSURFACE7 LPDDS_LoadFromFile(LPDIRECTDRAW7 lpdd,LPCTSTR lpszFileName)
  230. {
  231.     //load the bitmap
  232.     CGDICanvas gdic;
  233.     gdic.Load(NULL,lpszFileName);
  234.  
  235.     //create offscreen surface with same width and height
  236.     LPDIRECTDRAWSURFACE7 lpdds=LPDDS_CreateOffscreen(lpdd,gdic.GetWidth(),gdic.GetHeight());
  237.  
  238.     //retrieve hdc for surface
  239.     HDC hdcSurf;
  240.     lpdds->GetDC(&hdcSurf);
  241.  
  242.     //blit image onto surface
  243.     BitBlt(hdcSurf,0,0,gdic.GetWidth(),gdic.GetHeight(),gdic,0,0,SRCCOPY);
  244.  
  245.     //release dc
  246.     lpdds->ReleaseDC(hdcSurf);
  247.  
  248.     //return surface
  249.     return(lpdds);
  250. }
  251.  
  252. //reloading a bitmap from file to a surface
  253. void LPDDS_ReloadFromFile(LPDIRECTDRAWSURFACE7 lpdds, LPCTSTR lpszFileName)
  254. {
  255.     //load the bitmap
  256.     CGDICanvas gdic;
  257.     gdic.Load(NULL,lpszFileName);
  258.  
  259.     //retrieve hdc for surface
  260.     HDC hdcSurf;
  261.     lpdds->GetDC(&hdcSurf);
  262.  
  263.     //blit image onto surface
  264.     BitBlt(hdcSurf,0,0,gdic.GetWidth(),gdic.GetHeight(),gdic,0,0,SRCCOPY);
  265.  
  266.     //release dc
  267.     lpdds->ReleaseDC(hdcSurf);
  268. }
  269.  
  270. //safe release
  271. void LPDDS_Release(LPDIRECTDRAWSURFACE7* lplpdds)
  272. {
  273.     //safe release
  274.     if(*lplpdds)
  275.     {
  276.         (*lplpdds)->Release();
  277.         (*lplpdds)=NULL;
  278.     }
  279. }
  280.  
  281. ///////////////////////////////////////////////////////////////////////////////
  282. //Color Key Setting functions
  283. ///////////////////////////////////////////////////////////////////////////////
  284.  
  285. void LPDDS_SetSrcColorKey(LPDIRECTDRAWSURFACE7 lpdds,DWORD dwColor)
  286. {
  287.     //set up color key
  288.     DDCOLORKEY ddck;
  289.     ddck.dwColorSpaceHighValue=dwColor;
  290.     ddck.dwColorSpaceLowValue=dwColor;
  291.  
  292.     //set the color key
  293.     lpdds->SetColorKey(DDCKEY_SRCBLT,&ddck);
  294. }
  295.  
  296. ///////////////////////////////////////////////////////////////////////////////
  297. //Color Conversion Functions
  298. ///////////////////////////////////////////////////////////////////////////////
  299.  
  300. //from dd pixel to colorref
  301. COLORREF ConvertDDColor(DWORD dwColor, DDPIXELFORMAT* pddpf)
  302. {
  303.     //extract color components
  304.     DWORD dwRed=dwColor & pddpf->dwRBitMask;
  305.     DWORD dwGreen=dwColor & pddpf->dwGBitMask;
  306.     DWORD dwBlue=dwColor & pddpf->dwBBitMask;
  307.  
  308.     //multiply color components by max colorref value(255)
  309.     dwRed*=255;
  310.     dwGreen*=255;
  311.     dwBlue*=255;
  312.  
  313.     //divide by masks
  314.     dwRed/=pddpf->dwRBitMask;
  315.     dwGreen/=pddpf->dwGBitMask;
  316.     dwBlue/=pddpf->dwBBitMask;
  317.  
  318.     //return converted color
  319.     return(RGB(dwRed,dwGreen,dwBlue));
  320. }
  321.  
  322. //from colorref to dd pixel
  323. DWORD ConvertColorRef(COLORREF crColor, DDPIXELFORMAT* pddpf)
  324. {
  325.     //extract color components
  326.     DWORD dwRed=GetRValue(crColor);
  327.     DWORD dwGreen=GetGValue(crColor);
  328.     DWORD dwBlue=GetBValue(crColor);
  329.  
  330.     //multiply color components by max ddpixel value (the mask)
  331.     dwRed*=pddpf->dwRBitMask;
  332.     dwGreen*=pddpf->dwGBitMask;
  333.     dwBlue*=pddpf->dwBBitMask;
  334.  
  335.     //divide by max colorref(255)
  336.     dwRed/=255;
  337.     dwGreen/=255;
  338.     dwBlue/=255;
  339.  
  340.     //logical and with mask, to avoid fractions
  341.     dwRed&=pddpf->dwRBitMask;
  342.     dwGreen&=pddpf->dwGBitMask;
  343.     dwBlue&=pddpf->dwBBitMask;
  344.  
  345.     //merge together, and return the result
  346.     return(dwRed | dwGreen | dwBlue);
  347. }
  348.  
  349. ///////////////////////////////////////////////////////////////////////////////
  350. //Clipper utilities
  351. ///////////////////////////////////////////////////////////////////////////////
  352.  
  353. //create a IDirectDraw7 clipper, and fill it with the information from a region
  354. LPDIRECTDRAWCLIPPER LPDDCLIP_Create(LPDIRECTDRAW7 lpdd, HRGN hrgn)
  355. {
  356.     //create clipper
  357.     LPDIRECTDRAWCLIPPER lpddclip;
  358.     lpdd->CreateClipper(0,&lpddclip,NULL);
  359.  
  360.     //get size of buffer
  361.     DWORD dwBufSize=GetRegionData(hrgn,0,NULL);
  362.  
  363.     //allocate buffer
  364.     LPRGNDATA lprd=(LPRGNDATA)malloc(dwBufSize);
  365.  
  366.     //retrieve buffer
  367.     GetRegionData(hrgn,dwBufSize,lprd);
  368.  
  369.     //set clip list
  370.     lpddclip->SetClipList(lprd,0);
  371.  
  372.     //release buffer
  373.     free(lprd);
  374.  
  375.     //return clipper
  376.     return(lpddclip);
  377. }
  378.  
  379. //safe release of an IDirectDrawClipper
  380. void LPDDCLIP_Release(LPDIRECTDRAWCLIPPER* lplpddclip)
  381. {
  382.     //safe release
  383.     if(*lplpddclip)
  384.     {
  385.         (*lplpddclip)->Release();
  386.         (*lplpddclip)=NULL;
  387.     }
  388. }
  389.